package com._101aiot.web.asserts;

import com._101aiot.web.exception.BaseException;

/**
 * 自定义断言接口.
 * @author xiongguodong.
 * @link https://mp.weixin.qq.com/s/KDHz9rjV4WyONdIp5D_ZHQ
 */
public interface Assert {

    /**
     * 创建异常
     * @param args 可变参数
     * @return BaseException
     */
    BaseException newException(Object... args);


    /**
     * <p>断言对象<code>obj</code>非空。如果对象<code>obj</code>为空，则抛出异常
     *
     * @param obj 待判断对象
     */
    default void assertNotNull(Object obj) {
        if (obj == null) {
            throw newException();
        }
    }

    /**
     * <p>断言对象<code>obj</code>非空。如果对象<code>obj</code>为空，则抛出异常
     * <p>异常信息<code>message</code>支持传递参数方式，避免在判断之前进行字符串拼接操作
     *
     * @param obj 待判断对象
     * @param args message占位符对应的参数列表
     */
    default void assertNotNull(Object obj, Object... args) {
        if (obj == null) {
            throw newException(args);
        }
    }

    /**
     * <p>断言表达式<code>expression</code>非false。如果对象<code>expression</code>为false，则抛出异常
     *
     * @param expression boolean
     */
    default void isTrue(boolean expression) {
        if (!expression) {
            throw newException();
        }
    }

    /**
     * <p>断言表达式<code>expression</code>非false。如果对象<code>expression</code>为false，则抛出异常
     * <p>异常信息<code>message</code>支持传递参数方式，避免在判断之前进行字符串拼接操作
     *
     * @param expression boolean
     */
    default void isTrue(boolean expression, Object... args) {
        if (!expression) {
            throw newException(args);
        }
    }

}